package com.whfc.common.file;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * 文件处理抽象接口
 *
 * @author qzexing
 * @version 1.0
 * @date 2021-03-01 19:51
 */
public interface FileHandler {

    /**
     * 文件上传
     *
     * @param path
     * @param is
     * @return
     * @throws IOException
     */
    String upload(String path, InputStream is);

    /**
     * 文件上传
     *
     * @param path 文件路径
     * @param is   文件流
     * @param ex   过期时间
     * @return 文件地址
     */
    String upload(String path, InputStream is, String ex);

    /**
     * 文件上传
     *
     * @param path    文件路径
     * @param is      文件流
     * @param headers 请求头
     * @return 上传地址
     */
    String upload(String path, InputStream is, Map<String, String> headers);

    /**
     * 文件上传
     *
     * @param path    文件路径
     * @param is      文件流
     * @param headers 请求头
     * @param tags    文件标签
     * @return 上传地址
     */
    String upload(String path, InputStream is, Map<String, String> headers, Map<String, String> tags);

    /**
     * 下载文件
     *
     * @param ossKey       文件地址
     * @param saveFilePath 保存位置
     */
    void download(String ossKey, String saveFilePath);

    /**
     * 获取文件大小
     * @param ossKey 文件地址
     * @return 文件大小
     */
    Long getFileSize(String ossKey);

    /**
     * 批量删除
     *
     * @param fileUrls 文件地址
     */
    void delete(List<String> fileUrls);

    /**
     * 删除文件
     *
     * @param url 文件地址
     */
    void delete(String url);

    /**
     * 检测是否是文件
     *
     * @param path 文件路径
     * @return 是否是文件
     */
    boolean checkFile(String path);

    /**
     * 获取上传文件授权
     *
     * @param dir         文件上传的目录，  例： /ms/dev/file/
     * @param callbackUrl 上传回调地址
     * @return 上传文件授权信息
     */
    Map<String, String> getPolicy(String dir, String callbackUrl);

    /**
     * 获取上传文件授权
     *
     * @param dir 文件上传的目录，  例： /ms/dev/file/
     * @return 上传文件授权信息
     */
    Map<String, String> getPolicy(String dir);

    /**
     * 获取授权文件地址
     *
     * @param path 文件路径  例： /ms/dev/file/xxx.jpg
     * @return 文件地址
     */
    String getAuthFileUrl(String path);

    /**
     * 根据 http-url 获取对象存储key
     *
     * @param url 文件地址  例： https://file.whfciot.com/ms/dev/file/xxx.jpg
     * @return 文件路径     例： /ms/dev/file/xxx.jpg
     */
    String getPath(String url);

    /**
     * 根据对象存储key 获取 http-url
     *
     * @param path 文件路径 例： /ms/dev/file/xxx.jpg
     * @return 文件地址     例： https://file.whfciot.com/ms/dev/file/xxx.jpg
     */
    String parseUrl(String path);

    String parsOssUrl(String key);

    void rename(String key, String newName);
}
